// pages/cart/index.js

/**
 * 一  添加用户收获地址 
 *   1 绑定方法 
 *   2 调用小程序内置api 添加收获地址  wx.chooseAddress()  有问题 
 *   3   弹出用户授权添加收地地址弹框    
 *      scope 属性 如果为true 表示授权  如果为undefined 表示重来都没有授权过
 *      如果为false 表示取消 
 *         authSetting scope.address
 *    3.1 假如 用户点击 确定(scope 为true) 那么可以直接调用   wx.chooseAddress
 *    3.2  假如用户之前重来都没有授权过(scope 为undefined) 那么也可以直接调用  wx.chooseAddress
 *    3.3  假如用户点击取消（scope 为false） 需要引导用户打开设置页面 然后再去打开授权
 * 
 * 
 * 二    购物车商品展示 
 * 1 从缓存中获取到购物车商品  在什么位置获取？？
 * 2 进行商品展示  如果没有商品那么就给出一个空的购物车提示 如果有的话就进行商品展示
 * 3  是否商品被选中    
 *    如果所有的商品被选中 那么全选按钮应该选中 并且计算出所有商品的总价以及总数量
 *    如果有一个商品没有被选中,那么全选不应该被选中  并且只计算出 选中商品的价格
 * 4  状态发生改变后 需要把最新的商品数据重新返回到data 以及缓存里面
 * 
 * 
 * 
 * 三  单选按钮功能实现 
 * 1 找到单选按钮 
 * 2 绑定的是change事件(怎么判断点击的单选按钮具体是哪一个  通过id)
 * 3 判断所有的单选按钮是不是都被选中 如果有一个没有被选中那么全选按钮不被选中
 * 
 * 
 * 
 * 四   全选按钮功能实现 
 * 1 找到全选按钮 
 * 2 绑定的是change事件
 * 3 直接让每个单选的按钮的状态跟全选按钮的状态保持一致（如果全选选中 那么所有的单选都选中 
 * 如果全选不选中 所有的单选按钮都不选中）
 * 4  更新商品的总价格 总数量 
 * 5  把最新的数据返回到data里面以及缓存里面
 * 
 * 
 * 
 * 五   商品数量添加与减少功能 
 * 
 * 1  给我们  + -  绑定点击事件 view  
 * 2  判断 当前点击的是加号还是减号  
 * 3  如果点击的是+  那么该商品数量添加（+1）  并且同步商品的总价格 总数量都发生变化
 * 4  如果点击的是-  那么该商品数量减少（1）  并且同步商品的总价格 总数量都发生变化
 * 5  如果商品数量已经减到1了  如果再继续减那么提示用户是否要删除该商品 
 * 
 * 如果删除该商品 那么需要同步 商品的总价格 总数量 并且页面上的数据 需要重新同步到data   以及缓存里面
 *   
 *
 * 六  结算 
 * 1 绑定点击事件 
 * 2 判断 如果没有收获地址 不让结算 
 * 3 判断 如果没有任何一个件商品 不让结算 
 * 4 都符合条件那么就跳转到结算页面
 */



// 引入 我们封装的函数 
import {
  request
} from '../../request/index.js'

import {
  showModal,
  showToast
} from '../../utils/async.js'

import {
  getSetting,
  openSetting,
  chooseAddress
} from '../../request/cart.js'

import regeneratorRuntime from '../../lib/runtime/runtime';
Page({

  /**
   * 页面的初始数据
   */
  data: {
    address: {}, //定义初始收获地址
    cart: [], //定义初始购物车商品数据
    allChecked: false, //全选按钮初始状态
    totalPirce: 0, //商品初始总价格 
    totalNum: 0, //商品初始总数量

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },


  /**
   * 生命周期函数--监听页面显示 onShow表示页面展示
   */
  onShow: function () {
    // 获取收获地址
    let address = wx.getStorageSync('address')
    this.setData({
      address,
    })


    //  1  获取缓存数据商品 
    let cart = wx.getStorageSync('cart') || []
    this.setCart(cart)


    // //2 重新赋值 展示商品
    // this.setData({
    //   cart
    // })

    // //3 判断全选状态 以及总价格 总数量
    // // every 这个函数遍历的时候如果是空数组 那么也返回true
    // let allChecked = false

    // cart.length > 0 ? allChecked = cart.every(v => v.isCheck) : false
    // // console.log(allChecked, '111')
    // // this.setData({

    // // })
    // //4 计算商品的总价格和总数量
    // let totalPirce = 0
    // let totalNum = 0
    // cart.forEach(v => {
    //   if (v.isCheck) {
    //     totalPirce += v.goods_price * v.num
    //     totalNum = v.num
    //   }
    // })


    // this.setData({
    //   allChecked,
    //   totalPirce,
    //   totalNum,

    // })


    // wx.setStorageSync('cart', cart)






  },


  // 优化一 
  /** 
   * 
    async handlerAddress() {
    try {
      let  res1= await getSetting()
      let scope=res1.authSetting["scope.address"]
      if(scope===true||scope===undefined){
        let res2=await  chooseAddress()
        console.log(res2)
   
      }else {
         let res3= await openSetting()
   
          let res4= await  chooseAddress()
          console.log(res4)  
      }
      
    } catch (error) {
      console.log(error)
      
    }
  }
   * 
   * 
  */

  //方案二
  async handlerAddress() {
    try {
      let res1 = await getSetting()
      let scope = res1.authSetting["scope.address"]
      if (scope == false) {
        await openSetting()
      }
      let address = await chooseAddress()
      address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo
      this.setData({
        address
      })
      //  把收获地址放进缓存里面 
      wx.setStorageSync('address', address)

    } catch (error) {
      console.log(error)

    }
  },



  //4 单选按钮功能函数 

  handlerChange(e) {
    let {
      id
    } = e.currentTarget.dataset
    console.log(id)
    let {
      cart
    } = this.data

    //判断点击的哪一个单选按钮   
    let index = cart.findIndex(v => v.goods_id == id)
    console.log(index)
    // 让选中的取反
    cart[index].isCheck = !cart[index].isCheck
    this.setCart(cart)




  },

  //四 全选按钮功能函数
  handleItemAllCheck() {
    // wx.showToast({
    //   title: '全选',
    // })
    //  let  allChecked=this.data.allChecked
    //  let  cart  =this.data.cart
    let {
      allChecked,
      cart
    } = this.data
    allChecked = !allChecked //全选状态取反 
    cart.forEach(v => v.isCheck = allChecked)

    //同步更新 全选的状态与页面上数据的状态
    this.setData({
      cart,
      allChecked
    })

    this.setCart(cart) //同步更新全选的状态与页面上数据的状态以及总价格 总数量的状态
  },


  //五 商品数量的增加与减少功能函数
  async handleItemNumEdit(e) {
    //  1 确定具体点击的哪个商品的加号与减号    需要确定当前点击的加号还是减号
    // 那么需要传递2个参数 1  区分 具体哪个商品 goods_id  2 区分是加号还是减号 我们采用
    // 自定义传参来区分
    let {
      id,
      operation
    } = e.currentTarget.dataset
    console.log(id, operation)
    let cart = this.data.cart

    let index = cart.findIndex(v => v.goods_id === id)

    if (operation == -1 && cart[index].num == 1) {


      try {
        // 商品数量为1 并且还继续减少的话 
        // 提示用户书否要删除该商品
        await showModal({
          content: '是否要删除 确定不在考虑考虑'
        })
        cart.splice(index, 1)
        this.setCart(cart)

      } catch (error) {
        console.log(error)
      }

    } else {

      cart[index].num += operation
      console.log(cart[index].num)
      this.setCart(cart)

    }

  },

  // 六  结算功能函数 

   async handlePay() {
    // let {address}=this.data
    let address=this.data.address
    let totalNum=this.data.totalNum
    if(!address.userName) { //表示没有

      showToast({title:"请填写收获地址"})
          
      return    
    }
    if(totalNum===0) {
      showToast({title:"请添加商品"})
      return 

    }
    wx.navigateTo({
      url: '/pages/pay/index', //跳转到支付页面
    })


  },











  //设置购物车的状态  封装公共方法   

  setCart(cart) {

    // 全选状态开始
    let allChecked = false

    cart.length > 0 ? allChecked = cart.every(v => v.isCheck) : false
    console.log(allChecked, '111')
    // 全选状态结束



    //4 计算商品的总价格和总数量
    let totalPirce = 0
    let totalNum = 0
    cart.forEach(v => {
      if (v.isCheck) {
        totalPirce += v.goods_price * v.num
        totalNum = v.num
      }
    })
    this.setData({
      allChecked, //同步全选状态数据
      totalPirce,
      totalNum,
      cart //同步更新页面数据数据

    })

    wx.setStorageSync('cart', cart) //页面上的cart 状态都发生变化了 那么重新更新一下缓存里面的数据




  }


})




/*

  //定义添加收获地址方法 
  handlerAddress() {
  //1 获取用户设置权限 
  wx.getSetting({
    success:(res1)=>{
      // console.log(res1)
      let scope=res1.authSetting["scope.address"]
      if(scope===true||scope===undefined) { //scope===true 表示之前已经授权过用户收获地址，scope===undefined 表示第一次进来 那么就可以打开收获地址页面
        wx.chooseAddress({
          success: (res2) => {
            // console.log(res2)
          },
        })


      }else {  //取消授权（添加收获地址授权） 
        //引导用户打开个人设置页面 
        wx.openSetting({
          success:(res3)=>{
            console.log(res3)
            wx.chooseAddress({
              success: (res4) => {
                console.log(res4)
              },
            })
          }
        })
      } 
    }
  }) 
}
  
*/